package main

import "fmt"

func main() {
	//  声明切片  声明数组 不表明长度即为切片, 其余参考 04array
	var arr1 []int

	fmt.Printf("%v , %T, %v \n", arr1, arr1, len(arr1)) // [] , []int, 0

	// nil  == null

	// 关于切片的操作基本上跟python的列表操作一致， 不在赘述

	// 使用 make 创建切片
	// make(type, len,cap)  ==> type = 数据类型， len = 长度， cap = 容量 // 这个容量我还没明白什么意思，之前没用过第三个参数，但是实际上能打印出来

	var arr2 = make([]int, 4, 8)
	fmt.Printf("%v , %T, %v, %v\n", arr2, arr2, len(arr2), cap(arr2)) //[0 0 0 0] , []int, 4, 8

	// 切片追加  append(切片， 数据， 数据， 数据， 数据....)
	// ==>  同时可以合并切片 append(切片， 切片，切片.... )
	//    合并切片的数据类型要一致

	arr2 = append(arr2, 2)
	fmt.Printf("%v , %T, %v, %v\n", arr2, arr2, len(arr2), cap(arr2)) //[0 0 0 0] , []int, 4, 8

	// 使用copy() ==> 改为值类型引用，申请新的内存地址，  改变值不影响原切片
	// arr4 := arr3  ==> 引用切片， 地址引用，改变值影响原切片
	var arr3 = make([]int, 4)
	arr4 := arr3
	arr4[3] = 99
	fmt.Printf("%v , %T, %v\n", arr4, arr4, len(arr4)) // [0 0 0 99] , []int, 4
	fmt.Printf("%v , %T, %v\n", arr3, arr3, len(arr3)) // [0 0 0 99] , []int, 4
	arr5 := make([]int, 4)
	copy(arr5, arr3)
	arr5[2] = 88
	fmt.Printf("%v , %T, %v\n", arr5, arr5, len(arr5)) // [0 0 88 99] , []int, 4
	fmt.Printf("%v , %T, %v\n", arr3, arr3, len(arr3)) // [0 0 0 99] , []int, 4

	// golang中没有切片删除方法， 依靠 append + 切片处理删除元素
	arr6 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
	arr6 = append(arr6[:2], arr6[3:]...)               // 删除第三个元素 下标为2
	fmt.Printf("%v , %T, %v\n", arr6, arr6, len(arr6)) // [1 2 4 5 6 7 8 9] , []int, 8
}
